<?php
namespace App\Common\Lib\Fun;

use App\Common as com;
use think\facade\Request;

class Url {
	/**
	 * 页面重定向（不输出，仅返回html数据）
	 * @param string $msg 弹出的对话框文字内容，为空时不弹出消息
	 * @param string $event 转向的页面URL或方法 ["BACK":后退一步 || "GO_BACK":后腿并刷新 || "NOT":不转向 || "CLOSE":关闭当前窗口,不重定向 || "CURRENT":不带GET参数的当前页 || "CURRENTS":带GET参数的当前页 || 其它参数为跳转的URL]
	 * @example
	 * msgbox('BACK','后退一步');
	 */
	public static function msgboxHTML( $msg = '', $event = 'BACK', array $param = [] ){
		$param = array_merge( $param, [ 'is_die' => 0, 'is_echo' => 0 ] );
		return self::msgbox( $msg, $event, $param );
	}
	
	/**
	 * 页面重定向（直接输出html数据）
	 * @param string $msg 弹出的对话框文字内容，为空时不弹出消息
	 * @param string $event 转向的页面URL或方法 ["BACK":后退一步 || "GO_BACK":后腿并刷新|| "NOT":不转向 || "CLOSE":关闭当前窗口,不重定向 || "CURRENT":不带GET参数的当前页 || "CURRENTS":带GET参数的当前页 || 其它参数为跳转的URL]
	 * @param array $param 参数数组 <br />
	 * ················· [可空](is_echo)	$param['is_die']	说明：是否终止脚本执行。[0]不 [1][默认]是	<br />
	 * ················· [可空](is_echo)	$param['is_echo']	说明：是否直接输出内容。[0]不 [1][默认]输出	<br />
	 * ················· [可空/多选_A/必须](unknown_type)	$param['AAAAA']	说明：AAAAA	<br />
	 * msgbox('BACK','后退一步');
	 * @return void
	 */
	public static function msgbox( $msg = '', $event = 'BACK', array $param = [] ){
		// ...
		$param['is_die'] = $param['is_die'] ?? 1;
		$param['is_echo'] = $param['is_echo'] ?? 1;
		//
		$script = $msg != '' ? 'alert("'.$msg.'");' : NULL;
		switch($event){
			case 'BACK' : $script .= 'history.back(-1);'; break;
			case 'GO_BACK' : $script .= 'history.go(-1);'; break;
			case 'NOT' : break;
			case 'CLOSE' : $script .= 'window.opener=null; window.open("","_self"); window.close();'; break;
			case 'CURRENT' : $script .= 'location = "' . Request::instance()->baseUrl(true) . '";'; break;
			case 'CURRENTS' : $script .= 'location = "' . Request::instance()->url(true) . '";'; break;
			default : $script .= 'location = "'.$event.'";'; break;
		}
		//
		if( ! empty( $script ) ){
			$echo_str = '<script type="text/javascript">'.$script.'</script> ';
		}else{
			$echo_str = '';
		}
		//
		if( $param['is_echo'] ){
			echo $echo_str;
		}else{
			return $echo_str;
		}
		//
		if( $param['is_die'] ){
			exit();
		}
	}

	/**
	 * 修改/添加或删除URL中的GET变量
	 * @param string $name 要修改或添加的GET变量名称
	 * @param string $value 要修改或添加的GET变量值
	 * @param string $del 要删除的GET变量名称，多个变量用逗号隔开
	 * @return string 返回处理完毕的url
	 */
	protected static function alterUrl( $name = '', $value = '', $del = '' ){
		$get_prarm = Request::instance()->get();
		$del = explode( ',', $del );
		$result = Request::instance()->domain() . Request::instance()->instance()->baseUrl() . '?';
		foreach( $get_prarm as $i => $n ){
			if( $i != $name && !in_array( $i, $del ) && $n != '' && $i != '' ){
				@$result .= $i . '=' . rawurlencode( $n ) . '&';
			}
		}
		if( empty( $name ) ){
			$result = rtrim( $result, '&' );
		}else{
			$result .= $name . '=' . rawurlencode( $value );
		}
		return $result;
	}
	
	/**
	 * 修改/添加URL中的GET变量
	 * @param string $del：要删除的GET变量名称，多个变量用逗号隔开
	 * @return string 返回处理完毕的url
	 */
	public static function alterUrlAdd( $name = '', $value = '' ){
		return self::alterUrl( $name, $value, '' );
	}
	
	/**
	 * 删除URL中的GET变量
	 * @param string $del 要删除的GET变量名称，多个变量用逗号隔开
	 * @return string 返回处理完毕的url
	 */
	public static function alterUrlDel( $del = '' ){
		return self::alterUrl( null, null, $del );
	}

	/**
	 * 当前域名改为相对地址
	 * @param string $url
	 * @return string
	 */
	public static function currentDomainToRelativeUrl( string $url ):string {
		$domain = Request::domain();
		if( substr( $url, 0, strlen( $domain ) ) === $domain ){
			return substr( $url, strlen( $domain ) );
		}else{
			return $url;
		}
	}

	/**
	 * 如果为相对地址则添加当前域名
	 * @param string $url
	 * @return string
	 */
	public static function relativeUrlToCurrentDomain( string $url ):string {
		if( substr( $url, 0, 1 ) === '/' ){
			return Request::domain() . $url;
		}else{
			return $url;
		}
	}


}
